//
//  LWComposeView.swift
//  LW_Weibo
//
//  Created by 刘伟 on 16/7/16.
//  Copyright © 2016年 LWSpro. All rights reserved.
//

import UIKit
import pop

private var addHeight: CGFloat = 350

class LWComposeView: UIView {

    //设置一个数组,存储按钮
    var composeBtnArr: [LWComposeMenuButton] = [LWComposeMenuButton]()
    
    
    
    //MARK: - 懒加载控件  调用第三方框架
   private lazy var bgImageView: UIImageView = UIImageView(image: UIImage.getScreenShot().applyLightEffect())
    
    
    
    //MARK: - 重写
    override init(frame: CGRect) {
        
        super.init(frame: frame)
        
        layoutUI()
        
        
    }
    

    
    
    required init?(coder aDecoder: NSCoder) {
        fatalError("init(coder:) has not been implemented")
    }
    
    
    
    
    
    //截取屏幕快照 越模糊越好  截取屏幕的照片  也即是需要返回一个UIImage 一般如果一个方法中有返回值 并且返回值是一个控件 那么我们可以抽取出来 写到那个返回值的分类中  截取屏幕的快照抽取到了UIImage的分类中
    
    
    
    //MARK: - 添加控件 设置约束
    func layoutUI() {
        
        backgroundColor = RandomColor()
        
        //设置视图大小
        self.frame.size = CGSize(width: SCreenWidth, height: SCreenHeight)
        
        //添加控件
        addSubview(bgImageView)
        
        //设置约束
        bgImageView.snp_makeConstraints { (make) -> Void in
            
            make.edges.equalTo(self).offset(UIEdgeInsetsZero)
            
        }
        
        
        //添加按钮
        addChildButton()
        
    }
    
    
    
    
    //MARK: - 添加到父控件
    //最终都是要将当前视图添加到父控件上,我们就 直接在当前视图里直接添加即可  前提是能拿到父控件
    func show() {
        
        
        //  获取最上面的一个window  防止有键盘弹出来的时候 会出现keyWindow获取错误
        let window = UIApplication.sharedApplication().windows.last!
        
        window.addSubview(self)
        
        
        //一调用下面这个方法  就让按钮都弹出来
        for (i,value) in composeBtnArr.enumerate() {
      
             startAnimation(value, i: i, isUp: true)
            
        }
        
       
        
        

        
    }
    
    /* 将这个方法中的代码抽取到  startAnimation()  这个方法中
    
    func animationToView() {
        
        
        let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        
        for (i,value) in composeBtnArr.enumerate() {
           
            //动画执行的目的地
            animation.toValue = NSValue(CGPoint: CGPoint(x: value.centerX, y: value.centerY - addHeight))
            
            //设置弹簧效果,抖动幅度访问 范围 range [0, 20]
            animation.springBounciness = 8
            
            //抖动的初始速度
            animation.springSpeed = 10
            
            
            //开始动画的时间
            //后一个相对于前一个要延迟0.025秒执行 使用i 就是相对于上一个value的时间
            animation.beginTime = CACurrentMediaTime() + Double(i) * 0.025
            
            //执行动画
            value.pop_addAnimation(animation, forKey: nil)
            
            
            
        }
        
    }
    
    */
    
    
    
    
    
    
  
    
    //MARK: - 以动画的形式从屏幕下面一个个钻出来
    private func startAnimation(value: LWComposeMenuButton, i: Int, isUp: Bool) { //后面的Bool参数 是用来判断是 + addHeight  还是 - addHeight的
        
        
        //创建动画  以哪一个点为锚点
        let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        
        
        //判断y  如果是弹出来  那么就是 -  如果是回到底部 就是 +  即 isUp 如果是 true  那么就是 -   false 那么就是 +
        let y = isUp ? value.centerY - addHeight : value.centerY + addHeight
        

        //动画执行的目的地
        animation.toValue = NSValue(CGPoint: CGPoint(x: value.centerX, y: y))
        
        //设置弹簧效果,抖动幅度访问 范围 range [0, 20]
        animation.springBounciness = 8
        
        //抖动的初始速度
        animation.springSpeed = 10
        
        
        //开始动画的时间
        //后一个相对于前一个要延迟0.025秒执行 使用i 就是相对于上一个value的时间
        animation.beginTime = CACurrentMediaTime() + Double(i) * 0.025
        
        //执行动画
        value.pop_addAnimation(animation, forKey: nil)
        
        
    }
    
    
    
    
    
    
    
    
    
    
    //MARK: - 创建button
    private func addChildButton() {
        
        //一行有3个按钮 固定的 是个Int类型
        let rowBtnNums: Int = 3
        
        //把按钮的宽高定死
        let btnW: CGFloat = 80
        let btnH: CGFloat = 110
        
        //间距 屏幕宽度 - 3 * 按钮宽度 / （3 + 1）
        let btnMargin: CGFloat = (width - CGFloat(rowBtnNums) * btnW) / CGFloat(rowBtnNums + 1)
        
        
        //需要根据数组中元素的个数  来确定需要创建多少个按钮
        let btnComposeMenuArray = loadComposePlist()
        
        
        for (i, value) in btnComposeMenuArray.enumerate() {
            
            //创建按钮
            let button = LWComposeMenuButton()
            
            button.size = CGSize(width: btnW, height: btnH)
            //  计算列的索引
            let colIndex = i % rowBtnNums
            //  计算行的索引
            let rowIndex = i / rowBtnNums
            
            //  计算x坐标
            button.x = btnW * CGFloat(colIndex) + CGFloat(colIndex + 1) * btnMargin
            
            //  计算y坐标  后面加上SCreenHeight 是为了让这些按钮一开始是在下面的  我们点击' + ' 让按钮仿佛是一个个从下面钻出来的
            button.y = btnH * CGFloat(rowIndex) + CGFloat(rowIndex) * btnMargin + SCreenHeight
            
            button.setImage(UIImage(named: value.icon!), forState: .Normal)
            
            button.setTitle(value.title!, forState: .Normal)

            addSubview(button)
            
            
            //添加到数组中
            composeBtnArr.append(button)
            
        }
        

        
    }
    
    
    
    
    
    //MARK: - 加载plist文件 
    //将plist文件加载出来数据转换成模型  然后放到数组中 在将数组传回
    func loadComposePlist() -> [LWComposeMenu] {
        
        //先用数组接收 接收到的是字典数组 因为这个plist文件里面存放的是字典数组
        let composeDicArr = NSArray(contentsOfFile: (NSBundle.mainBundle().pathForResource("compose.plist", ofType: nil))!)
        
        //可变数组 用于接收转换成的模型
        var tempArr = [LWComposeMenu]()
        
        
        //遍历这个字典数组  将里面的字典元素转换成模型
        for dic in composeDicArr! {
            
            let compMenu = LWComposeMenu(dic: dic as! [String : AnyObject])
            
            tempArr.append(compMenu)
            
            
        }
        
        
        return tempArr
        
        
    }
    
    
    
    //MARK: - 触摸屏幕
    override func touchesBegan(touches: Set<UITouch>, withEvent event: UIEvent?) {
        
        //移除蒙版之前  先让按钮都以动画的形式回到底部
        
        //进行抽取 这段代码和这个方法animationToView()中的代码 雷同 可以抽取到 startAnimation() 这个方法中
        /*
        
        let animation = POPSpringAnimation(propertyNamed: kPOPViewCenter)
        
        
        //倒着取值  即让最下面的一排先回到底部按钮  那么就要先拿到数组最后的元素 依次下去
        for (i,value) in composeBtnArr.reverse().enumerate() {
        
        //动画执行的目的地
        animation.toValue = NSValue(CGPoint: CGPoint(x: value.centerX, y: value.centerY + addHeight))
        
        //设置弹簧效果,抖动幅度访问 范围 range [0, 20]
        animation.springBounciness = 8
        
        //抖动的初始速度
        animation.springSpeed = 10
        
        
        //开始动画的时间
        //后一个相对于前一个要延迟0.025秒执行 使用i 就是相对于上一个value的时间
        animation.beginTime = CACurrentMediaTime() + Double(i) * 0.025
        
        //执行动画
        value.pop_addAnimation(animation, forKey: nil)
            
        
        }
        
        */
        
        
        
        
        //倒着取值  即让最下面的一排先回到底部按钮  那么就要先拿到数组最后的元素 依次下去
        for (i,value) in composeBtnArr.reverse().enumerate() {
            
            //第一个value就是数组中最后一个button
            startAnimation(value, i: i, isUp: false)
            
            
        }

        
        

        //触摸屏幕  从父控件移除
        //我们的蒙版是要从父控件上面移除的  这个方法就是直接从父控件移除 并不用写在父控件中 只要有父控件 那么这个方法就可以执行
        
        //让这个方法在异步线程上执行 目的就是为了先让按钮回到底部的效果显现出来
        dispatch_after(dispatch_time(DISPATCH_TIME_NOW, (Int64)(0.3 * Double(NSEC_PER_SEC))),dispatch_get_main_queue()) { () -> Void in
            
            
            self.removeFromSuperview()
            
        }
        
        
        
    }
    
    
    
    

}
